package com.casa_apoio.util;

import com.sun.faces.context.FacesFileNotFoundException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import javax.faces.context.FacesContext;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.export.JRHtmlExporter;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.export.JRXlsExporter;
import net.sf.jasperreports.engine.export.oasis.JROdtExporter;
import net.sf.jasperreports.engine.util.JRLoader;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

public class RelatorioUtil {

    public static final int RELATORIO_PDF = 1;
    public static final int RELATORIO_EXCEL = 2;
    public static final int RELATORIO_HTML = 3;
    public static final int RELATORIO_OPEN_OFICCE = 4;

    public StreamedContent geraRelatorio(HashMap parametroRelatorio, String nomeRelatorioJasper, String nomeRelatoprioSaida, int tipoRelatorio) throws FileNotFoundException, SQLException {
        System.out.println("------ Gera Relatorio --------");
        AcessoBD acessoBD = new AcessoBD();
        StreamedContent arquivoRetorno = null;
        try {
            FacesContext context = FacesContext.getCurrentInstance();
            Connection conexao = acessoBD.getConexao();

            String caminhoRelatorio = context.getExternalContext().getRealPath("relatorios");
           System.out.println("Caminho Relatorio " + context.getExternalContext().getRealPath("relatorios"));
            String caminhoArquivoJasper = caminhoRelatorio + File.separator + nomeRelatorioJasper + ".jasper";
            System.out.println("Caminho completo " + caminhoArquivoJasper);
            String caminhoArquivoRelatorio = "";
            System.out.println("Fez a leitura 1 ");
            JasperReport relatorioJasper = (JasperReport) JRLoader.loadObjectFromFile(caminhoArquivoJasper);
                       
            System.out.println("Fez a leitura 2 ");
            JasperPrint impressoraJasper = JasperFillManager.fillReport(relatorioJasper, parametroRelatorio, conexao);
            JRExporter tipoArquivoExportado = null;
            String extensaoArquivoExportado = "";
            File arquivoGerado = null;
            System.out.println("--- Antes do Case ---");
            switch (tipoRelatorio) {
                case RelatorioUtil.RELATORIO_PDF:
                    tipoArquivoExportado = new JRPdfExporter();
                    extensaoArquivoExportado = "pdf";
                    System.out.println("--- PDF --");
                    break;
                case RelatorioUtil.RELATORIO_EXCEL:
                    tipoArquivoExportado = new JRXlsExporter();
                    extensaoArquivoExportado = "xls";
                    System.out.println("--- excel --");
                    break;
                case RelatorioUtil.RELATORIO_HTML:
                    tipoArquivoExportado = new JRHtmlExporter();
                    extensaoArquivoExportado = "html";
                    System.out.println("--- HTML --");
                    break;
                case RelatorioUtil.RELATORIO_OPEN_OFICCE:
                    tipoArquivoExportado = new JROdtExporter();
                    extensaoArquivoExportado = "ods";
                    break;
                default:
                    tipoArquivoExportado = new JRPdfExporter();
                    extensaoArquivoExportado = "pdf";
                    break;
            }
            caminhoArquivoRelatorio = caminhoRelatorio + File.separator + nomeRelatoprioSaida + "." + extensaoArquivoExportado;
            arquivoGerado = new java.io.File(caminhoArquivoRelatorio);
            tipoArquivoExportado.setParameter(JRExporterParameter.JASPER_PRINT, impressoraJasper);
            tipoArquivoExportado.setParameter(JRExporterParameter.OUTPUT_FILE, arquivoGerado);
            tipoArquivoExportado.exportReport();
            arquivoGerado.deleteOnExit();
            InputStream conteudoRelatorio = new FileInputStream(arquivoGerado);
            arquivoRetorno = new DefaultStreamedContent(conteudoRelatorio, "application/" + extensaoArquivoExportado, nomeRelatoprioSaida + "." + extensaoArquivoExportado);
        } catch (JRException e) {
            throw new FacesFileNotFoundException("Não foi possivel geral o relatorio " + e);
        } catch (FileNotFoundException e) {
            throw new FacesFileNotFoundException("Arquivo do relatorio não encontrado " + e);
        }
        return arquivoRetorno;
    }

}
